<?php
/**
 * Élément de base des objets
 *
 * @package cass
 * @author Mickaël CASTANHEIRO <mickael.castanheiro@gmail.com>
 * @version 1.0
 */

namespace cass;
require_once __PATH__ . '/lib/cass/abstract/Element.class.php';
abstract class Singleton extends Element {
    static private $instances = array();

    /**
     * Le constructeur d'un singleton est forcémment privé (protected pour l'héritage)
     * @abstract
     * @param <mixed> Aucun paramètre pour un singleton
     */
    abstract protected function __construct();

    /**
     * Retourne l'instance unique de la classe
     * @return <called_class> Instance de la classe apellée 
     */
    static public function getInstance() {
        $class = static::getClassName();

        if ( empty(self::$instances[$class]) OR !(self::$instances[$class] instanceof static) ) {
            self::$instances[$class] = new static;
        }
        return self::$instances[$class];
    }
}
?>
